/*

*
* */
var express=require('express');//引入
var bodyParser=require("body-parser");//引入获得post的中间件  body-parser
var MongoClient=require('mongodb').MongoClient;
var mongodbDb='test';
var mongodbUrl='mongodb://127.0.0.1:27017/'+mongodbDb;
var mongodbClient = new MongoClient(mongodbUrl);

var cookieParser=require('cookie-parser');//引入cookie
var session=require('express-session');//引入session
var MongoStore=require('connect-mongo')(session);//引入connect-mongo 存储session信息到mongoDB

var app=express();//实例化 构建一个对象

app.set('view engine','ejs');//设置模版引擎的类型
app.set("views",__dirname+'/views');//设置模版的默认位置 把原先放ejs的模版的views  修改成statics
// app.engine('html',ejs.__express) //修改express默认模版ejs扩展名
// app.set('view engine','html');//设置模版引擎的类型

app.use(express.static("public"));//定义express找静态文件的路径 配置public目录为我们的静态资源目录
app.use('/baike',express.static("baikePublicStatic"));

//http://127.0.0.1:3000/baike/baidu.png 到baikePublicStatic' 虚拟路由指定到baikePublicStatic
// 中间件 是指匹配路由之前或者匹配路由 之后所做的一系列的操作,表示匹配任何路由 app.use
//权限判断 判断用户是否登录 ,没登录就强制登录 登录了就继续浏览
// next();继续向下匹配路由
app.use(function (req,res,next) {//自定义中间件
    // console.log(new Date());
    if (session.userinfo && session.userinfo.name!=""){//有session 并且有name 不为空的时候
        next();//next函数意思是 继续往下执行
    }else {//没有session
        if (req.url!="/login"&&req.url!="/dologin"){ //没有session 不是login 强制转到login
            console.log(req.url)
            res.redirect('/login');//强制登录
        }else {//没有session 是login 继续往下走 next()
            next();
        }
        // next();
    }
    // next();
});
app.use(bodyParser.urlencoded({extended:false}));//获取post 数据的中间件
app.use(bodyParser.json());//获取post提交数据 数据的中间件
//设置cookie中间件
app.use(cookieParser());

//设置session的中间件
app.use(session({
    secret: 'keyboard cat',
    // name:'cid',
    resave: false,
    saveUninitialized: true,
    cookie: {
        maxAge:1000*30*60,//设置超时时间
        // secure: true// secure加密  是指https 这样的访问时 才可以访问cookie
    },
    rolling:true,//续cookie过期时间

    //设置session信息到mongoDM的中间件
    store: new MongoStore({
        url: 'mongodb://127.0.0.1:27017/test-app',//数据库地址
        touchAfter: 24 * 3600 // time period in seconds
    })
}));

app.get('/',function (req,res) {
    if(req.session.username){
        res.send("你好"+req.session.username+"欢迎回来");
    }else{
        // res.send("未登录");
        res.redirect('/login');//登录成功跳转到商品列表
    }
});
app.get('/set',function (req,res) {
    var m=777-333;
    // res.cookie('name',"zhangsan",{maxAge:900000,path:'/news',httpOnly:true,signed:true,domain:".aaa.com"});//设置cookie
    res.cookie('password',m,{maxAge:900000,signed:true,httpOnly:true});//设置cookie
    res.cookie("age","20",{maxAge:900000,httpOnly:true});
    res.send('设置cookie成功 ');

});
//浏览过的城市用cookies表示出来
app.get('/lvyou',function (req,res) {
    // console.log(req.query.city);

    if (!req.query.city){//url中没有city
        if(req.cookies.citys){
            var citys=req.cookies.citys;

        }else{
           var citys="空";
        }
        res.send('您浏览过的城市是:'+citys);
    }else{//url中有city
        if (req.cookies.citys){//cookies里有citys
            var city=req.query.city;
            var citys=req.cookies.citys;
            citys=citys+" "+city;
            res.cookie('citys',citys,{maxAge:900000,httpOnly:true});
        }else{//url中有city cookies里没有citys
            var city=req.query.city;
            var citys="";
            citys=citys+" "+city;
            res.cookie('citys',citys,{maxAge:900000,httpOnly:true});
        }

        // res.send(city);
        console.log(req.cookies.citys);
        res.send('您浏览过的城市是:'+city);
        // res.send('您浏览过的城市是:'+citys);
    }




});
app.get('/login',function (req,res) {
    // req.session.username="zhangsan";//设置session
    res.render("login");
});
//获取登录提交的数据
app.post('/doLogin',function (req,res) {
    console.log(req.body);//这个可以获得post上来的数据
    mongodbClient.connect(function(err) {
        if(!err) {
            console.log("Connected successfully to server");
            var db = mongodbClient.db(mongodbDb);
            console.log(req.body.name)
            db.collection('user').find({"name":req.body.name,"password":req.body.password}).toArray(function (err, data) {
                console.log(data);
                //console.log(err);
                //if (data!=[] && !err){//如果data不为空和不报错
                if (!err){
                    if (data.length>0){
                        console.log(123);
                        // res.send('登录成功');
                        //1.保存用户信息 用session
                        if(data.length>0){
                            // console.log(data);
                            session.userinfo=data[0];
                            res.redirect('/product');//登录成功跳转到商品列表

                            // app.locals['userinfo']=session.userinfo;//配置全局变量可以在任何模版里使用

                        }else{
                            res.send("<script>alert('登录失败1');location.href='/login'</script>");
                        }
                    }else {
                        console.log(234);
                        res.send("<script>alert('登录失败2');location.href='/login'</script>");
                    }

                    // console.log(req.body);

                    // if (!err && docs!=[]) {//如果没有出错,查询成功
                    //     // console.log(docs[0])
                    //     if(docs[0].password==req.body.password){
                    //         res.send('login success!!')
                    //     }else{
                    //         res.send('name or password is wrong')//密码输错了
                    //     }
                    // } else {
                    //     res.end("name or password is wrong");//用户名输错了
                    // }
                }else {
                    console.log("查询有错误:")
                    console.log(err)
                }

            });
        }
        //mongodbClient.close();
    })

});
//退出登录
app.get('/loginout',function (req,res) {
    //req.session.cookie.maxAge=0;// sessions销毁 第1种方法 改变cookie的过期时间
    req.session.destroy(function (err) {
        console.log(err);
    });
    // res.send('已经退出登录');
    res.redirect('/login');
});

app.get('/product',function (req,res) {//获取get传值 http://127.0.0.1:3000/product?aid=45
    res.render('product', {userinfo:session.userinfo});
});
app.get('/productadd',function (req,res) {
    res.render('productadd',{userinfo:session.userinfo});
});
app.get('/productedit',function (req,res) {
    res.render('productedit',{userinfo:session.userinfo});
});
app.get('/productdelete',function (req,res) {
    res.send('productdelete',{userinfo:session.userinfo});
});
app.get('/register',function (req,res) {
    res.send('注册模块 ');
});

//动态路由传值 http://127.0.0.1:3000/news/2313
app.get('/news/:aid',function (req,res) {

    console.log(req.params); //req.params 获取动态路由的传值
    var aid=req.params.aid;
    res.send('news模块:'+aid);
});
app.get('/index',function (req,res,next) {
console.log("你好");
    next();
});

app.get('/index',function (req,res) {
    // res.send('ejs演示');
    var msg='abc';
    res.render('index',{msg:msg});//渲染模版 render渲染 用express中的res.render不用写模版扩展名ejs
});


//没有匹配到路由 就执行404
app.use(function (req,res) {
    res.status(404).send('这是404 表示路由没有匹配到')

});
app.listen(3000,'127.0.0.1');